import { Time, Ms, FormatType } from "./Def"

/** 时间工具 */
export namespace TimeUtil {

    /** 补零 */
    function zeroFill(num: number, n: number) {
        return (new Array(n).join('0') + num).slice(-n)
    }

    /** 
     * 时间转为Date类
     * @param time 时间
     */
    export function toDate(time: Time) {
        return time instanceof Date ? time : new Date(time)
    }

    /** 
     * 时间转为时间戳
     * @param time 时间
     */
    export function toTime(time: Time) {
        return typeof time == "number" ? time : (typeof time == "string" ? new Date(time) : time).getTime()
    }

    /**
     * 时间转为格式化日期 yyyy-MM-dd
     * @param time 时间
     */
    export function dateF(time: Time) {
        let d = toDate(time),
            yyyy = d.getFullYear(),
            MM = zeroFill(d.getMonth() + 1, 2),
            dd = zeroFill(d.getDate(), 2)
        return `${yyyy}-${MM}-${dd}`
    }

    /**
     * 时间转为格式化时间 yyyy-MM-dd HH-mm-ss
     * @param time 时间
     */
    export function timeF(time: Time) {
        let d = toDate(time),
            df = dateF(d),
            HH = zeroFill(d.getHours(), 2),
            mm = zeroFill(d.getMinutes(), 2),
            ss = zeroFill(d.getSeconds(), 2)
        return `${df} ${HH}:${mm}:${ss}`
    }

    /** 今天格式化日期 */
    export function today() { return dateF(new Date()) }

    /** 当前格式化时间 */
    export function now() { return timeF(new Date()) }

    /**
     * 时间加毫秒
     * @param ms 毫秒
     * @param time 时间(默认：当前时间)
     */
    export function addTime(ms: number, time: Time = Date.now()) {
        return toTime(time) + ms
    }

    /**
     * 时间加毫秒 返回格式化时间
     * @param ms 毫秒
     * @param time 时间(默认：当前时间)
     * @param type 格式化类型(默认：格式化时间 yyyy-MM-dd HH-mm-ss)
     */
    export function addTimeF(ms: number, time: Time = Date.now(), type = FormatType.time) {
        let t = addTime(ms, time)
        switch (type) {
            case FormatType.date: return dateF(t)
            case FormatType.time: return timeF(t)
        }
    }

    /**
     * 两个时间的时间差
     * @param t1 时间1
     * @param t2 时间2(默认：当前时间)
     * @param type 时间差类型(默认：ms)
     * @param floor 是否取整(默认：false)
     */
    export function timeDiff(t1: Time, t2: Time = Date.now(), type = Ms.one, floor = false) {
        let start = toTime(t1)
        let end = toTime(t2)
        let diff = Math.abs(end - start) / type
        return floor ? Math.floor(diff) : diff
    }
}